
\documentclass{article}

\usepackage{ctex}
\usepackage{tikz}

\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{plantuml}
\title{文件IO}
\author{张毅}


\def\plantumlpath{...} % 替换为实际的PlantUML可执行文件路径

\begin{document}
	\maketitle

	\section{IO的概念}
	\textbf{Java 中的文件 I/O}
	\begin{itemize}
		\item	FileInputStream 和 FileOutputStream：用于字节流的读写。
		\item BufferedReader 和 BufferedWriter：用于字符流的读写，通常与 FileReader 和 FileWriter 结合使用。
		\item File 类：用于文件和目录的路径操作。
		\item Files 类：提供了许多静态方法，简化了文件操作。
	\end{itemize}
	
	\textbf{文件 I/O 的注意事项}
	\begin{itemize}
			\item 异常处理：文件 I/O 操作可能会抛出各种异常，如 FileNotFoundException、IOException 等，需要进行适当的异常处理。
			\item 资源管理：确保在完成文件操作后关闭文件，可以使用 try-with-resources 语句自动管理资源。
			\item 性能优化：使用缓冲流（如 BufferedReader 和 BufferedWriter）可以显著提高读写性能
	\end{itemize}
	
	\section{字节流byte}
	 任意文件的操作,
	\subsection{字节输入流-InputStream}
	是抽象类,无法进行实例化,只能实例化子类
	
	\subsubsection{FileInputStream}
	
	
	\subsection{字节输出流-OutputStream}
	是抽象类,无法进行实例化,只能实例化子类
	
	\subsubsection{FileOutputStream}
	
	\section{字符流char}
	txt打开后,可以识别的文件,txt,xml,lrc,md文件
	\subsection{字符输入流-Reader}
	是抽象类,无法实例化,只能实例化子类
	
	\subsubsection{FileReader}
	\subsection{字符输出流-Writer}
	是抽象列,无法实例化,只能实例化子类
	
	\subsubsection{FileWriter}
	\newpage
	\section{大文件上传}
	什么是大文件: 传输效率特别的慢的文件,比如上传异常的耗时
	\subsection{分片上传}
	分片上传原理说明: 分片上传的原理是指将一个大型文件分成若干个小的数据块（也称为分片或切片），然后分别独立上传这些小数据块到服务器，最后由服务器将所有的分片重新组合成原始的大文件。这样做的主要目的是解决一次性上传整个大文件可能导致的网络不稳定、超时、带宽限制等问题，尤其适用于上传大容量文件至云端存储或其他远程服务的场景。
	
	以下是分片上传的主要步骤：
	\begin{enumerate}
		\item 	文件分割： 在客户端（通常是浏览器或应用程序），使用相应API（如File API）将大文件分割成预设大小的较小数据块。每一块都有一个唯一的标识符或序号，用于在服务器端重组时确定其顺序和归属。
		\item 	分片上传： 分别上传每一个分片到服务器，每次只上传一小部分数据。每个分片上传成功后，服务器都会返回一个确认响应，表明这一分片已经接收成功。
		\item 	跟踪状态： 客户端需维护一个状态表，记录每个分片上传的状态（如已上传、待上传、上传失败等）。这样即使在上传过程中发生错误或网络中断，也可以从断点处恢复上传，这就是所谓的“断点续传”。
		\item 	合并文件： 当所有分片都上传成功后，服务器根据每个分片的标识符将它们按顺序拼接在一起，最终形成原始的完整文件。
		\item 	校验完整性： 为了保证上传后的文件与原始文件内容一致，可以在上传前计算文件的MD5或其他哈希值，并将此值随分片一同上传。服务器在完成文件合并后，也会计算合并后的文件的哈希值，对比两者是否一致，从而验证上传的完整性。
		
		通过分片上传的方式，可以显著提高大文件上传的成功率和稳定性，并提供更好的用户体验。此外，这种方式还能更好地利用网络资源，避免单一长连接带来的问题，并能更好地支持并发上传，加快整体上传速度。
	\end{enumerate}

	\subsection{原理示意图}
	
	
	\subsubsection{这是一个大文件}
	\begin{tikzpicture} % 开始一个新的 TikZ 图形环境
		
		% 画一个矩形，坐标原点在左下角，边长分别为3cm和2cm
		\draw (0,0) rectangle (10,1) node[pos=.5] {大文件}; 
		
	\end{tikzpicture} % 结束当前的 TikZ 图形环境
	
	
	\subsubsection{文件进行切片操作}
	% \tikz \node foreach \x in{1,...,4} foreach \y in {1,2,3} [draw] at (\x,\y) {\x,\y};
	\begin{tikzpicture}
			
			\node foreach \x in {1,...,10} foreach \y in {1}  [draw] at (\x,\y) {第\x片};
	\end{tikzpicture}
	
	特殊说明
	
	\begin{enumerate}
		\item 前端对文件进行分片
		\item 后端进行文件合并
		\item 每一个切片都必须带有索引,标识当前时第几段
	\end{enumerate}
	
	
	\section{Minio}
	
	Spring Boot + Vue 整合 MinIo ,只需要导入Minio的依赖,配置MinClient 的客户端的属性值即可,
	Vue 设置为 手动上传
	
	\subsection{Minio服务}
	\textbf{bucket,需要入库} 
	
	存储桶
	
	\textbf{Object,需要入库}
	
	文件
	
	文件的访问路径url ,需要入库吗? 
	
	\subsection{SpringBoot整合Minio}
	
	\textbf{后端使用参数}     
	
	public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) 
	
	\textbf{如果有额外的参数,比如新增id参数}
	
	    public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file,@RequestParam("id") String id) 
	
	
	\subsection{Vue}
	\textbf{如果后端只接受文件}
	
	vue 使用文件上传组件,vue 组件中的 action 必须是全路径,不支持参数的拼接, 比如只写 /api/file/posts
	action="https://jsonplaceholder.typicode.com/posts/"
	
	\textbf{如果后端需要文件以外的额外的参数,比如id}
	
	vue 使用文件上传组件,vue 组件中的 action 必须是全路径,支持参数的拼接
	action="https://jsonplaceholder.typicode.com/posts/?id=" + id
\end{document}